package glub.hlzds.mijia;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class Encript {
    //鍗佸叚杩涘埗涓嬫暟瀛楀埌瀛楃鐨勬槧灏勬暟缁?
    private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    /**鎶奿nputString鍔犲瘑*/
    public static String md5(String inputStr){
        return encodeByMD5(inputStr);
    }

    public static void main(String[] args) {
        System.out.println(stringMD5("111111"));

    }



    public static String stringMD5(String input) {

        try {

            // 拿到一个MD5转换器（如果想要SHA1参数换成”SHA1”）

            MessageDigest messageDigest =MessageDigest.getInstance("MD5");


            // 输入的字符串转换成字节数组

            byte[] inputByteArray = input.getBytes();



            // inputByteArray是输入字符串转换得到的字节数组

            messageDigest.update(inputByteArray);



            // 转换并返回结果，也是字节数组，包含16个元素

            byte[] resultByteArray = messageDigest.digest();



            // 字符数组转换成字符串返回

            return byteArrayToHex(resultByteArray);



        } catch (NoSuchAlgorithmException e) {

            return null;

        }

    }

    public static String byteArrayToHex(byte[] byteArray) {

        // 首先初始化一个字符数组，用来存放每个16进制字符

        char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };



        // new一个字符数组，这个就是用来组成结果字符串的（解释一下：一个byte是八位二进制，也就是2位十六进制字符（2的8次方等于16的2次方））

        char[] resultCharArray =new char[byteArray.length * 2];



        // 遍历字节数组，通过位运算（位运算效率高），转换成字符放到字符数组中去

        int index = 0;

        for (byte b : byteArray) {

            resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];

            resultCharArray[index++] = hexDigits[b& 0xf];

        }



        // 字符数组组合成字符串返回

        return new String(resultCharArray);


    }
    /**
     * 楠岃瘉杈撳叆鐨勫瘑鐮佹槸鍚︽纭?
     * @param password 鐪熸鐨勫瘑鐮侊紙鍔犲瘑鍚庣殑鐪熷瘑鐮侊級
     * @param inputString 杈撳叆鐨勫瓧绗︿覆
     * @return 楠岃瘉缁撴灉锛宐oolean绫诲瀷
     */
    public static boolean authenticatePassword(String password,String inputString){
        if(password.equals(encodeByMD5(inputString))){
            return true;
        }else{
            return false;
        }
    }

    /**瀵瑰瓧绗︿覆杩涜MD5缂栫爜*/
    private static String encodeByMD5(String originString){
        if (originString!=null) {
            try {
                MessageDigest md5 = MessageDigest.getInstance("MD5");
                byte[] results = md5.digest(originString.getBytes());
                System.out.println(Arrays.toString(results));
                String result = byteArrayToHexString(results);
                return result;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 杞崲瀛楄妭鏁扮粍涓哄崄鍏繘鍒跺瓧绗︿覆
     * @param b 瀛楄妭鏁扮粍
     * @return 鍗佸叚杩涘埗瀛楃涓?
     */
    private static String byteArrayToHexString(byte[] b){
        StringBuffer resultSb = new StringBuffer();
        for(int i=0;i<b.length;i++){
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    private static String byteToHexString(byte b){
        int n = b;
        if(n<0)
            n=256+n;
        int d1 = n/16;
        int d2 = n%16;
        return hexDigits[d1] + hexDigits[d2];
    }
}